const NacosNamingClient = require('nacos').NacosNamingClient;
const AServiceRegistry = require('./AServiceRegistry');
const LoadBalancer = require('./loadbalancer/LoadBalancer');

/**
 * 使用 nacos 作为微服务注册，发现和配置管理中心
 */
class NacosServiceRegistry extends AServiceRegistry {

    client;
    loadBalancer;

    constructor(param) {
        super(param);

        this.loadBalancer = new LoadBalancer(param.SELECT_STRATEGY);

        console.debug("创建 nacos 客户端", param.nodes);
        this.client = new NacosNamingClient({
            logger: console,
            serverList: param.nodes, // replace to real nacos serverList
            namespace: 'public',
        });

        this.client.ready().then(() => console.debug(" nacos 客户端连接成功"));
    }

    /**
     * 监控注册的服务变更事件,如服务实例加入，移除，配置数据变更
     * @param {Array<String>} services 监控的服务集合
     */
    subscribeEvent(services) {
        services.forEach(service => {
            this.client.subscribe({
                serviceName: service
            }, hosts => {
                let arr = hosts.filter(host => host.healthy).map(host => `http://${host.ip}:${host.port}`);
                this.loadBalancer.updateCache(service, arr);
            });
        });
    }

    /**
     * 根据服务名称获取可访问的一个节点，如果有多个可用节点
     * @param {String} service 服务名称
     * @returns String 服务调用地址
     */
    getServiceNode(service) {
        return this.loadBalancer.getRealPath(service);
    }

    /**
     * 释放客户端
     */
    close() {
        console.debug("进入 close ")
    }
}

module.exports = NacosServiceRegistry;